'''
没有封装的接口代码：每一个自动化测试方法需要加异常机制 +log
基类的封装思路：
    1 - 加入异常捕获 +log
    2 - 截图操作 -- ui自动化
    3 - 一般模块的常用接口    增删改查
def request(method.url,**kwargs)


一个项目的版本定下来之后：
    一个接口有10个用例：
        1 - 变得是  接口的描述、接口的用例请求参数，预期的响应
        请求和响应数据类型一眼固定 -- json 数据
'''
from utils.handle_yaml import get_Yaml_data
import requests
from configtt.configs import HOST
from utils.handle_path import config_path
import os
import inspect
'''
公共的基类  关于token  公共鉴权值怎么处理
    1 - 登录接口不需要
    2 - 其他业务接口一定
'''

# 获取类名  __class.__name__ 获取类名
class BaseApi:  # 基类
    def  __init__(self,inToken=None):   # 初始化方法  如果子类没有init方法会调父类的init 方法  （所以只要继承init data 都会被调）
        print('当前类名是>>>>>>',self.__class__.__name__)
        # self.data = get_Yaml_data('../configtt/apiConfig.yml')  获取全部数据 返回字典
        self.data = get_Yaml_data('../configtt/apiConfig.yml')[self.__class__.__name__]  #获取键名  #获取整个yaml数据，通过调用的类名来去获取yaml对应“类名键值”的数据
#---------------商铺需要--------------------------------
        if inToken:  # 有值
            self.header = {'Authorization': inToken}   #token  大多数业务会有 放在基类中
        else:
            self.header = None
#-----------------------------------------------------
        # 公共的发送方法------每个接口都会去调用去发送请求
    def request_send(self,data=None,json=None,params=None,file=None,id=''):
        try:
            methodName = inspect.stack()[1][3]  #谁调用了request_send 方法，函数名就作为methodname
            '''
            一个项目版本定好之后，
                    1个接口有10条用例
                        变得是： 接口得描述、接口得用例、请求参数、预期响应
                        不变得是： url  请求方法  
            '''
            #  谁调用我的方法，路径和方法自己Yaml获取
            path,method = self.data[methodName].values()   #登录所有的数据-- 需要剥离对应某一个接口的数据（因我Yaml 写的是path 和 method）
            resp = requests.request(method=method,url=f'{HOST}{path}'+str(id),data=data,json=json,params=params,headers=self.header,files=file)
            print(resp.text)  # requests.request(method,url) 方法 固定的是方法和url
            # id 拼接不能为none
            #拼接
            # a = [HOST,path]
            # print(''.join(a))

            # print(methodName,'----------',self.data[methodName])
            return resp.json()
        except Exception as error:
            # 打印日志
            raise error

#-----------------------商品接口-----------------------------------
    # 1 - 新增接口
    def add(self,inData):
        return self.request_send(data=inData)
    # 2 -删除接口   对应某一个id  删除 /delete/api/{id}
    def delete(self):
        pass
    # 更新接口
    def update(self,inData):
        return self.request_send(data=inData)
    #查询接口
    def query(self,inData):
        return self.request_send(params=inData)
    #5 - 文件上传
    '''
    工作中遇到不怎么接触的接口时候： 
        1 - 网上了解接口用法
        2 - 抓包  
        请求体数据
        userFile = {'变量名':(文件名，文件对象，文件类型)}
      
    '''
    def file_upload(self,fileDir:str):
        # 示例： fileDir = d:/123.png  fileName=123.png   fileType=png
        fileName = fileDir.split('/')[-1]
        fileType =  fileDir.split('.')[-1]

        userFile = {'file': (fileName,open(fileDir,mode='rb'),fileType)}
        return self.request_send(file=userFile)
#--------------------------------------------------------------------
class ApiAssert:
    @classmethod # 类方法
    def define_api_assert(cls,result,condition,exp_result):
        try:
            if condition == '=':
                assert result == exp_result
            elif condition == 'in':
                assert result in exp_result
        except Exception as error:
            raise error #抛出异常



            #日志
# -----------------------------------------------------
'''
inspect
1 - 可以获取类或函数的参数的信息
2 - 获取当前本函数的函数名
3 - 获取调用价格函数的函数名

'''
import inspect,sys
def a():

    print('谁调用我A的函数',inspect.stack()[1][3])

def b():
    print('b')
    a()
    print('b函数--当前自己的函数名',sys._getframe().f_code.co_name)

b()

def c():
    a()
c()